home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <errno.h>
- #ifdef __GNUC__
- #include <inline/exec.h>
- #include <dos/dos.h>
- #include <inline/dos.h>
- #endif
- #ifndef __GNUC__
- #include <clib/exec_protos.h>
- #include <clib/dos_protos.h>
- #endif
- #include <exec/lists.h>
- #include <exec/nodes.h>
- #include <exec/memory.h>
-
- struct filenode
- {
- struct MinNode node; /* Nicht für stdin, stdout, stderr */
- FILE FILE;
- };
-
- extern struct MinList __filelist;
- extern void chkabort(void);
-
- FILE *fopen(const char *filename,const char *mode)
- {
- struct filenode *node;
- BPTR file;
- LONG openmode,accessmode;
- int append=0,plus=1;
- chkabort();
- SetIoErr(0);
- switch(mode[0])
- {
- case 'r':
- openmode=MODE_OLDFILE;
- accessmode=MODE_OLDFILE;
- break;
- case 'w':
- openmode=MODE_NEWFILE;
- accessmode=MODE_NEWFILE;
- break;
- case 'a':
- openmode=MODE_READWRITE;
- accessmode=MODE_NEWFILE;
- append=1;
- break;
- default:
- return NULL;
- }
- if(mode[1]=='b')
- plus=2;
- switch(mode[plus])
- {
- case '+':
- accessmode=MODE_NEWFILE;
- if(mode[plus+1])
- return NULL;
- break;
- case '\0':
- break;
- default:
- return NULL;
- }
- node=(struct filenode *)AllocVec(sizeof(struct filenode),MEMF_PUBLIC);
- if(node!=NULL)
- {
- SetIoErr(0);
- file=Open(filename,openmode);
- if(file!=NULL)
- {
- if(ChangeMode(CHANGE_FH,file,accessmode))
- {
- node->FILE.file=file;
- node->FILE.error=0;
- node->FILE.uc=0;
- if(append)
- Seek(file,0,OFFSET_END);
- if(!IoErr())
- { AddHead((struct List *)&__filelist,(struct Node *)&node->node);
- return &node->FILE; }
- else
- errno=IoErr();
- }
- else
- errno=IoErr();
- Close(file);
- }
- else
- errno=IoErr();
- FreeVec(node);
- }
- else
- errno=ENOMEM;
- return NULL;
- }
-
- int fclose(FILE *stream)
- {
- ULONG retval=0;
- struct filenode *node;
- chkabort();
- node=(struct filenode *)((struct MinNode *)stream-1);
- Remove((struct Node *)&node->node);
- SetIoErr(0);
- Flush(node->FILE.file)?0:EOF;
- if(IoErr())
- { errno=IoErr();
- retval=errno; }
- Close(node->FILE.file);
- FreeVec(node);
- return retval;
- }
-
- void __exitio(void)
- {
- struct MinNode *node;
- while((node=__filelist.mlh_Head)->mln_Succ!=NULL)
- fclose(&((struct filenode *)node)->FILE);
- }
-
- int fgetc(FILE *stream)
- {
- int retval;
- chkabort();
- SetIoErr(0);
- retval=FGetC(stream->file);
- stream->error=IoErr();
- stream->uc=0;
- return retval;
- }
-
- int fputc(int c,FILE *stream)
- {
- int retval;
- chkabort();
- SetIoErr(0);
- retval=FPutC(stream->file,c);
- stream->error=IoErr();
- stream->uc=0;
- return retval;
- }
-
- int ungetc(int c,FILE *stream)
- {
- int retval;
- chkabort();
- if(stream->uc)
- return EOF;
- retval=UnGetC(stream->file,c);
- stream->error=0;
- stream->uc=1;
- return retval;
- }
-